<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 用递归写
        // 找规律,找出口
        // 递归的规律   先执行的最后被执行完

        // 4.写一个函数,实现n的阶乘
        // var num = parseInt(window.prompt());

        // function mul(n) {
        //     if (n == 1 || n == 0) {
        //         return 1;
        //     }
        //     return n * mul(n - 1);
        // }
        // console.log(mul(num));


        // 5.写一个函数,实现斐波那契额数列
        // function test(n) {
        //     if (n == 1 || n == 2) {
        //         return 1;
        //     }
        //     return test(n - 1) + test(n - 2);
        // }
        // console.log(test(6));

        //     作用域
        // 作用域定义:变量(变量作用域又称上下文)和函数生效(能被访问)的区域
        // 全局,局部变量
        // 作用域的访问顺序

        // js运行三部曲
        //   语法解析
        //   预编译
        //   解释执行

        // 预编译前奏
        //   1.imply global暗示全局变量:即任何变量,如果变量未经声明就赋值,此变量就为全局对象所有
        //     eg:a = 123;
        //     eg:var a = b = 123;
        //   2.一切声明的 全局 变量,全是window的属性
        //     eg:var a = 123; ===>window.a = 123;

        // 函数声明整体提升
        // 变量  声明提升
        // var a;
        // console.log(a);
        // a = 1;


        //            预编译
        // 四部曲
        // 1.创建AO对象(Activation Object)(执行期上下文)
        // 2.找形参和变量声明，将变量和形参名作为AO属性名，值为undefined
        // 3.将实参值和形参统一
        // 4.在函数体里面找函数声明，值赋予函数体
        // function fn(a) {
        //     console.log(a);
        //     var a = 123;
        //     console.log(a);

        //     function a() {}
        //     console.log(a);
        //     var b = function() {}
        //     console.log(b);

        //     function d() {}
        // }
        // fn(1);
        // 预编译发生在函数执行的前一刻

        // function test(a, b) {
        //     console.log(a);
        //     c = 0;
        //     var c;
        //     a = 3;
        //     console.log(b);
        //     b = 2;
        //     console.log(b);

        //     function b() {}

        //     function d() {}
        //     console.log(b);
        // }
        // test(1);


        // 生成了一个GO对象 Global Object(全局的执行期上下文)
        // GO {
        //     a: 123
        // }
        // var a = 123;

        // function a() {}
        // console.log(a); //123




        // golbal = 100;

        // function fn() {
        //     console.log(global); //undefined
        //     global = 200;
        //     console.log(global); //200
        //     var global = 300;
        // }
        // fn();
        // var global;


        // function test() {
        //     console.log(b); //undefined
        //     if (a) {
        //         var b = 100;
        //     }
        //     console.log(b); //undefined
        //     c = 234;
        //     console.log(c); //234
        // }
        // var a;
        // test();
        // a = 10;
        // console.log(c); //234



        // 1.function bar() {
        //     return foo;
        //     foo = 10;

        //     function foo() {
        //         //...
        //     }
        //     var foo = 11;
        // }
        // console.log(bar()); //function foo(){//...}





        // console.log(bar()); //11

        // function bar() {
        //     foo = 10;

        //     function foo() {}
        //     var foo = 11;
        //     return foo;
        // }






        // a = 100;

        // function demo(e) {
        //     function e() {}
        //     arguments[0] = 2;
        //     console.log(e); //2
        //     if (a) {
        //         var b = 123;

        //         function c() {}
        //     }
        //     var c;
        //     a = 10;
        //     var a;
        //     console.log(b); //undefined   这个时候a是undefined,所以不走if里面的东西
        //     f = 123;
        //     console.log(c); //undefined  if中不允许定义函数
        //     console.log(a); //10
        // }
        // var a;
        // demo(1);
        // console.log(a); //100
        // console.log(f); //123








        // 回顾隐式类型转换
        // var str = false + 1;
        // console.log(str);
        // var demo = false == 1;
        // console.log(demo);
        // if (typeof(a) && -true + (+undefined) + '') {
        //     console.log('基础扎实');
        // }
        // if (11 + '11' * 2 == 33) {
        //     console.log('基础扎实');
        // };
        // !!' ' + !!'' - !!false || console.log('能打印吗？');




        // var x = 1;
        // if (function f() {}) {
        //     x += typeof(f);
        // }
        // console.log(x);




        // (window.foo || (window.foo = 'bar'));
        // console.log(window.foo);
    </script>
</body>

</html>